 #ifndef __CPPTUTORGLOBALS_H__
 #define __CPPTUTORGLOBALS_H__

#define P(EX) cout << #EX << ": " << EX << endl;

#if defined(WIN32) && !defined(__CYGWIN__)
	#include <process.h>
	#include <direct.h>
	#include <windows.h>
#else
    #include <stdlib.h>
    #include <unistd.h>
#endif

// global error codes
enum eReturnCodes
{
    DONOTHING,
    SUCCESS,
    FAILURE
};

#ifdef WIN32
#define	SLEEP(x)	Sleep (x);
#else
#define	SLEEP(x)	sleep (x);
#endif //WIN32

//extern bool debug;

//#define       CPPTUTOR_TEST

//#define       OPERATOR_OVERLOADING

//#define       ARITHMETIC_ADDITION_OPERATOR
//#define       ARITHMETIC_SUBSTRACTION_OPERATOR

//#define       PASSING_VALUES
//#define       PASS_BY_VALUE
//#define       PASS_BY_REFERENCE
//#define       PASS_BY_ADDRESS

//#define       OVERLOADING_STRUCTURE_POINTER
//#define       OVERLOAD_IO_OPERATOR

#define       UNARY_OVERLOADING_OPERATOR
//#define       UNARY_OVERLOADING_OPERATOR_USING_FRIEND
//#define       UNARY_OVERLOADING_OPERATOR_PLUS
//#define       UNARY_OVERLOADING_OPERATOR_MINUS
//#define       UNARY_OVERLOADING_OPERATOR_PREFIX_INCREMENT
//#define       UNARY_OVERLOADING_OPERATOR_POSTFIX_INCREMENT
//#define       UNARY_OVERLOADING_OPERATOR_PREFIX_DECREMENT
//#define       UNARY_OVERLOADING_OPERATOR_POSTFIX_DECREMENT
//#define       UNARY_OVERLOADING_OPERATOR_BITWISE_COMPLEMENT
//#define       UNARY_OVERLOADING_OPERATOR_LOGICAL_NOT
//#define       UNARY_OVERLOADING_OPERATOR_POINTER_DEREFERENCE

//#define       BINARY_OVERLOADING_OPERATOR
//#define       BINARY_OVERLOADING_OPERATOR_USING_FRIEND
//#define       BINARY_OVERLOADING_OPERATOR_ADDITION
//#define       BINARY_OVERLOADING_OPERATOR_SUBATRACTION
//#define       BINARY_OVERLOADING_OPERATOR_ADDITION_ASSIGNMENT

//#define       SPECIFIERS
//#define       FUNCTION_POINTER
//#define       CONSTRUCTOR_CHAINING
//#define       CONST_CLASS_OBJECTS_AND_MEMBER_FUNCTIONS
//#define       ACCESSING_STATIC_MEMBER

//#define       FRIEND
//#define       FRIEND_FUNCTION
//#define       FRIEND_CLASS
//#define       NESTED_FRIEND

//#define       CASTING
//#define       CASTING_NEW
//#define       STATIC_CAST
//#define       CONST_CAST
//#define       DYNAMIC_CAST

//#define       INHERITANCE
//#define       INHERITANCE_TEST  // enable this also 
//#define       PUBLIC_INHERITANCE
//#define       PROTECTED_INHERITANCE
//#define       VIRTUAL_CALL_IN_CONSTRUCTOR

//#define       POINTER
//#define       POINTER_TEST
//#define       FUNCTION_POINTER
//#define       POINTER_ARITHMETIC

//#define       VIRTUAL_CALL_DESTRUCTOR

//#define       NESTED_CLASS
        
//#define       POLYMORPHISM
//#define       VIRTUAL_FUNCTION
//#define       VIRTUAL_DESTRUCTOR

//#define       DATA_STRUCTURE
//#define       LINKED_LIST
//#define       SINGLE_LINKED_LIST
//#define       LINKED_LIST_NEW
//#define       CIRCULAR_LINKED_LIST
//#define       DOUBLY_LINKED_LIST

//#define       STACK
//#define       STACK_USING_ARRAY
//#define       STACK_USING_LINKED_LIST

//#define       SIZE_OF_CLASS_WITH_VIRTUAL
//#define       ONE_VIRTUAL
//#define       TWO_VIRTUAL

//#define       ABSTRACT_BASE_CLASS
//#define       INTERFACCE_CLASS

//#define       COMPOSITION
//#define       AGGREGATION

//#define		COPY_CONSTRUCTOR
//#define		USER_COPY_CONSTRUCTOR
//#define       COPY_CONSTRUCTOR_VS_ASSIGNMENTOPERATOR
//#define       USER_DEFINED_COPY_CONSTRUCTOR
//#define       USER_DEFINED_ASSIGNMENT_OPERATOR

//#define       INTER_PROCESS_COMMUNICATION
//#define       MULTITHREADING
//#define       MULTI_THREAD
//#define       MUTEX_DEMO
//#define       THREAD_LIB
//#define       SOCKET
//#define       SOCKET_UDP
//#define       SOCKET_TCP
//#define       SOCKET_CLIENT
//#define       SOCKET_SERVER
 
//#define       UNION

//#define       SIMPLE_STRUCTURE
//#define       TYPEDEF_WITH_STRUCT
//#define       POINTERS_TO_STRUCTS

//#define       ENUM

//#define       ARRAY
//#define       POINTERS_AND_BRACKETS
//#define       PASSING_ARRAY_AS_ARGUMENT

//#define       SIZEOF

//#define       DESIGN_PATTERN
//#define       CREATIONAL
//#define       SINGLETON
//#define       FACTORY
//#define       BEHAVIOURAL
//#define       OBSERVER
//#define       COMMAND
//#define       STRUCTURAL_PATTERN
//#define       FACADE

//#define       C
//#define       MEMORY_MANAGEMENT
//#define       MALLOC
//#define       CALLOC
//#define       REALLOC
//#define       MY_MEMORY_MANAGER
//#define       VER_1
//#define       VER_2
//#define       STD_LIB_IMPL
//#define       STATIC
//#define       EXTERN

//#define       AUTO_PTR

//#define       STANDARD_TEMPLATE_LIBRARY
//#define       STL_VECTOR
//#define       STL_MAP
//#define       STL_MAP_CREATE
//#define       STL_MAP_DISPLAY
//#define       STL_MAP_ERASE
//#define       STL_MAP_INSERT
//#define       STL_MAP_COUNT
//#define       STL_MAP_OPERATOR_EQUAL
//#define       STL_MAP_SWAP
//#define       STL_LIST
//#define       STL_LIST_DISPLAY
//#define       STL_LIST_ASSIGN
//#define       STL_LIST_CLEAR
//#define       STL_LIST_PUSH_BACK
//#define       STL_LIST_EMPTY
//#define       STL_LIST_ERASE

//#define       MEMORY_MANAGEMENT_CPP

//#define       CONST_CORRECTNESS
//#define       POINTER_TO_A_CONSTANT
//#define       CONST_POINTER
//#define       CONSTANT_POINTER_TO_A_CONSTANT

//#define       MIXING_C_CPP

//#define       TEMPLATE
//#define       FUNCTION_TEMPLATE
//#define       CLASS_TEMPLATE

//#define       CPP_OX
//#define       UNIQUE_PTR
//#define       SHARED_PTR

//#define       LOCAL_CLASS

//#define       INLINE_FUNCTION

//#define       CONST_INITIALIZE
//#define       CONST_INITIALIZE_USING_INITIALIZER_LIST
//#define       CONST_INITIALIZE_ASSIGNEMNT_INSIDE_CONSTRUCTOR

//#define       OVERRIDE_VIRTUAL_FUNC_RETURN
//#define       POINTER_TO_MEMBERS
//#define       POINTER_TO_MEMBERS_DATA
//#define       POINTER_TO_MEMBERS_FUNCTION
 #endif //__CPPTUTORGLOBALS_H__
